const system = require('./system');
const path = require('path')
const sqlite3 = require('sqlite3').verbose();
const Database = require('better-sqlite3');
const config = require('./config')

const database_name = config.get('database_name');

const dbPath = path.join(system.getHomePath(),database_name);
console.log(`dbPath=${dbPath}`)
// const db = new sqlite3.Database(dbPath);

function getDatasource(){
    const db = new Database(dbPath);
    return db;
}

// 同步查询
function query(sql,params) {
    params = params || []
    let db = getDatasource();
    try {
        console.log('query sql=',sql)
        console.log('params=',params)
        const statement = db.prepare(sql);
        const result = statement.all(params);
        return result;
    } catch (error) {
        throw new Error('Query failed: ' + error.message);
    }finally {
        db.close();
    }
}


function execute(sql,params) {
    let db = getDatasource();
    params = params || []
    // let db = getDatasource();
    try {
        console.log('execute sql=',sql)
        console.log('params=',params)
        const updateStatement = db.prepare(sql);
        const result = updateStatement.run(params);
        console.log('execute result=',result)
        return result;
    } catch (error) {
        throw new Error('Update failed: ' + error.message);
    }finally {
        // 关闭数据库连接
        db.close();
    }
}

function executeTransaction(db,sql,params) {
    params = params || []
    // let db = getDatasource();
    try {
        console.log('execute sql=',sql)
        console.log('params=',params)
        const updateStatement = db.prepare(sql);
        const result = updateStatement.run(params);
        console.log('execute result=',result)
        return result;
    } catch (error) {
        throw new Error('Update failed: ' + error.message);
    }finally {
        // 关闭数据库连接
        // db.close();
    }
}


function batchUpdate(sql,paramList) {
    let db = getDatasource();
    try {
        db.transaction(() => {
            for (const param of paramList) {
                const updateStatement = db.prepare(sql);
                updateStatement.run(param);
            }
        })();
    } catch (error) {
        throw new Error('Bulk update failed: ' + error.message);
    }finally {
        db.close();
    }
}


function batchUpdateTransaction(db,sql,paramList) {
    try {
        db.transaction(() => {
            for (const param of paramList) {
                const updateStatement = db.prepare(sql);
                updateStatement.run(param);
            }
        })();
    } catch (error) {
        throw new Error('Bulk update failed: ' + error.message);
    }finally {
        // db.close();
    }
}

function transaction(exec_function){
    let db = getDatasource();
    try {
        db.transaction(() => {
            // 执行一些 SQL 操作
            exec_function(db);
            // // 如果发生错误，抛出异常，事务将回滚
            // throw new Error('Simulating an error');
        })();
        console.log('Transaction successful');
    } catch (error) {
        throw error;
    } finally {
        db.close();
    }
}




// 创建或连接到 SQLite 数据库
// db.serialize(() => {
//     // 创建表格
//     // db.run('CREATE TABLE IF NOT EXISTS users (id INT, name TEXT)')
//
//     ;
//
//     // function execute(sql){
//     //     db.run(sql);
//     //
//     // }
//
//     function executeSQL(sql, params) {
//         return new Promise((resolve, reject) => {
//             db.all(sql, params, (err, rows) => {
//                 if (err) {
//                     reject(err.message);
//                 } else {
//                     // console.log('Query results:');
//                     // rows.forEach((row) => {
//                     //     console.log(`ID: ${row.id}, Name: ${row.name}`);
//                     // });
//                     resolve(rows);
//                 }
//             });
//         });
//     }
//
//
//     function batchExecuteSQL(sql,paramsArray) {
//         return new Promise((resolve, reject) => {
//             db.run('BEGIN TRANSACTION', (beginErr) => {
//                 if (beginErr) {
//                     reject(beginErr.message);
//                     return;
//                 }
//
//                 // const sql = 'INSERT INTO users VALUES (?, ?)';
//
//                 const insertPromises = paramsArray.map((object) => {
//                     let params = [];
//                     for(let o of object){
//                         params.push(o);
//                     }
//                     return executeSQL(sql, params);
//                 });
//
//                 Promise.all(insertPromises)
//                     .then(() => {
//                         db.run('COMMIT', (commitErr) => {
//                             if (commitErr) {
//                                 reject(commitErr.message);
//                             } else {
//                                 resolve();
//                             }
//                         });
//                     })
//                     .catch((error) => {
//                         db.run('ROLLBACK', () => {
//                             reject(error);
//                         });
//                     });
//             });
//         });
//     }
//
//     // function executeSQLSync(sql, params) {
//     //     // const sql = 'INSERT INTO users VALUES (?, ?)';
//     //     // const params = [id, name];
//     //     return  util.promisify(executeSQL);
//     // }
//     //
//     // function updateData(sql, params) {
//     //     // const sql = 'UPDATE users SET name = ? WHERE id = ?';
//     //     // const params = [newName, id];
//     //     return executeSQL(sql, params);
//     // }
//     //
//     // function deleteData(sql,params) {
//     //     // const sql = 'DELETE FROM users WHERE id = ?';
//     //     // const params = [id];
//     //     return executeSQL(sql, params);
//     // }
//
//     // 导出模块函数
//     module.exports = {
//         executeSQL,
//         batchExecuteSQL,
//
//     };
// });

module.exports = {
    query,
    execute,
    batchUpdate,
    executeTransaction,
    batchUpdateTransaction,
    transaction,

};
